package com.soywer.rpc.rpc04;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

import com.soywer.rpc.common.IUserService;
import com.soywer.rpc.common.User;

/**
 * 功能描述：
 * 相对于rpc03,这个版本改进在于，客户端调用某个服务的methodName可以指定了；服务端根据指定的方法名返回对应的数据
 * @author 18065916_李猛
 * @since 2021/3/8
 */
public class Stub {

    public static IUserService getStub(){
        InvocationHandler h = new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
                Socket s = new Socket("127.0.0.1",8888);
                //对象输出流
                ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                //方法名
                String methodName = method.getName();
                //方法参数类型
                Class[] parameterTypes = method.getParameterTypes();
                oos.writeUTF(methodName);//对象输出流-写方法名
                oos.writeObject(parameterTypes);//对象输出流-写参数类型
                oos.writeObject(args);//对象输出流-写参数
                oos.flush();//对象输出流-刷新

                //数据输入流
                DataInputStream dis = new DataInputStream(s.getInputStream());
                //数据输入流-读取服务端返回的数据
                int receiveId = dis.readInt();
                //数据输入流-读取服务端返回的数据
                String name = dis.readUTF();
                User user = new User(receiveId , name);

                oos.close();
                s.close();
                return user;
            }
        };
        Object o = Proxy.newProxyInstance(IUserService.class.getClassLoader(),new Class[]{IUserService.class},h);
        System.out.println( "class name is " + o.getClass().getName());
        System.out.println(o.getClass().getInterfaces()[0]);
        return (IUserService)o;
    }

}
